package com.lhl.fw.core.base;

import cn.hutool.json.JSONUtil;
import com.lhl.fw.core.exception.CommonErrorCode;
import lombok.Builder;
import lombok.Data;

import java.io.Serializable;
import java.util.Map;

/**
 * @className: ResultDTO
 * @description: 通用返回结果
 * @author: king
 * @date: 2020-09-09 15:00
 **/
@Data
@Builder
public class ResultDTO<T> implements Serializable {
    /**
     * 是否成功
     */
    private Boolean succ;

    /**
     * 服务器当前时间戳
     */
    private Long ts;

    /**
     * 成功数据
     */
    private T data;

    /**
     * 分页数据总条数
     */
    private Long total;

    /**
     * 错误码
     */
    private String code;

    /**
     * 消息描述
     */
    private String msg;

    /**
     * 验证字段错误消息描述
     */
    private Map<String, String> errors;

    /**
     * 获取 json
     */
    public String buildResultJson() {
        return JSONUtil.toJsonStr(this);
    }

    /**
     * @param:
     * @description: 创建默认成功返回数据
     * @return: com.lhl.fw.core.base.ResultDTO.ResultDTOBuilder<java.lang.Object>
     * @author: king
     * @date: 2021-01-10 10:54
     */
    public static ResultDTOBuilder<Object> getSuccessDto(){
        return ResultDTO.builder().succ(true).ts(System.currentTimeMillis());
    }
    /**
     * @param:
     * @description: 创建默认失败返回数据
     * @return: com.lhl.fw.core.base.ResultDTO.ResultDTOBuilder<java.lang.Object>
     * @author: king
     * @date: 2021-01-10 10:54
     */
    public static ResultDTOBuilder<Object> getFailDto(){
        return ResultDTO.builder().succ(false).ts(System.currentTimeMillis());
    }
    /**
     * @param: commonErrorCode
     * @description: 根据所给错误类型,创建返回数据
     * @return: com.lhl.fw.core.base.ResultDTO.ResultDTOBuilder<java.lang.Object>
     * @author: king
     * @date: 2021-01-10 10:55
     */
    public static ResultDTOBuilder<Object> getFailDto(CommonErrorCode commonErrorCode){
        return ResultDTO.builder().succ(false).ts(System.currentTimeMillis())
                .code(commonErrorCode.getCode()).msg(commonErrorCode.getMessage());
    }

    /**
     * @param: code 错误码
     * @param: msg 错误消息
     * @description: 根据所给的错误码和错误消息构建返回数据
     * @return: com.lhl.fw.core.base.ResultDTO.ResultDTOBuilder<java.lang.Object>
     * @author: king
     * @date: 2021-01-10 11:20
     */
    public static ResultDTOBuilder<Object> getFailDto(String code, String msg){
        return ResultDTO.builder().succ(false).ts(System.currentTimeMillis())
                .code(code).msg(msg);
    }
}